<?php
/**
 * Created by PhpStorm.
 * Author: ljz
 * Date: 2023/5/10
 * Time: 16:22
 */

namespace App\backend\models;


use App\common\models\BaseModel;
use Illuminate\Support\Facades\DB;

/**
 * Class OrderModel
 * @package app\common\models
 */
class CategoryModel extends BaseModel
{
    const table = 'category';
    const status = 0;

    protected static $config = array(
        /* 主键 */
        'primary_key' => 'id',
        /* 父键 */
        'parent_key' => 'parent_id',
        /* 展开属性 */
        'expanded_key' => 'expanded',
        /* 叶子节点属性 */
        'leaf_key' => 'leaf',
        /* 孩子节点属性 */
        'children_key' => 'children',
        /* 是否展开子节点 */
        'expanded' => false
    );

    /* 结果集 */
    protected static $result = array();

    /* 层次暂存 */
    protected static $level = array();

    public function __construct() {

    }

    /**
     * 查询字段规则
     *
     * @return array
     */
    static public function rules()
    {
        return [];
    }

    /**
     * 添加/编辑 字段规则
     *
     * @return array
     */
    static public function modify_rules()
    {
        return [
            'name' => 'required|string|max:255', // 分类名称
            'thumb' => 'string|max:255', // 分类图片
            'subscript' => 'string|max:255', // 角标
            'enabled' => 'int', // 状态:是否开启 1开启 0不开启
            'level' => 'int', // 等级：0，1，2，3
            'parent_id' => 'int', // 父级id
            'thumb_url' => 'string', // 轮播图片url
        ];
    }

    /**
     * 查询字段规则
     *
     * @return array
     */
    static public function enabled_rules()
    {
        return [
            'id' => 'required|int', // 商品分类ID
            'enabled' => 'required|int', // 是否开启	1开启 0关闭
        ];
    }

    /**
     * 查询字段规则
     *
     * @return array
     */
    static public function updated_rules()
    {
        return [
            'id' => 'required|int', // 商品分类ID
            'status' => 'required|int', // 是否删除	1删除 0未删除
        ];
    }

    /**
     * 字段验证返回错误信息
     *
     * @return array
     */
    static public function message()
    {
        return [
            'id.required' => '分类ID不能为空',
            'id.int' => '分类ID数据类型有误',
            'store_id.required' => '商户ID不能为空',
            'store_id.int' => '商户ID数据类型有误',
            'goods_id.required' => '商品ID不能为空',
            'goods_id.int' => '商品ID数据类型有误',
            'name.required' => '分类名称不能为空',
            'name.max' => '分类名称长度超过限制',
            'thumb.max' => '分类图片长度超过限制',
            'subscript.max' => '角标长度超过限制',
            'enabled.int' => '分类状态数据类型有误',
            'level.int' => '分类等级数据类型有误',
            'parent_id.int' => '父级ID数据类型有误',
        ];
    }

    /**
     * 数据库 - 查询商品分类列表
     * @param $string string //数组
     * @return array
     */
    static public function in_arr($string = '')
    {
        $in_arr = explode(",", $string);
        $data = DB::table(self::table)
            ->select('id', 'name')
            ->where('status', '=',self::status)
            ->whereIn('id', $in_arr)
            ->get();
        return $data;
    }

    /**
     * 数据库 - 查询商品列表
     * @param $where_in_data array //in 查询条件 参数数组
     * @param $where_data array //查询条件 参数数组
     * @param $select_data array //查询字段 参数数组
     * @return array
     */
    static public function listed($where_data = [], $where_in_data = [], $select_data = ['*'])
    {
        $query = DB::table(self::table)
            ->select($select_data)
            ->where($where_data);

        if (!empty($where_in_data)) {
            $query->whereIn('id', $where_in_data);
        }

        $data = $query->get()->toArray();
        return $data;
    }

    static function makeTreeCore($index, $data, $type = 'linear')
    {
        extract(self::$config);
        foreach ($data[$index] as $id => $item) {
            if ($type == 'normal') {
                if (isset($data[$id])) {
                    $item[$children_key] = self::makeTreeCore($id, $data, $type);
                }
                $r[] = $item;
            } else if ($type == 'linear') {
                $parent_id = $item[$parent_key];
                self::$level[$id] = $index == 0 ? 0 : self::$level[$parent_id] + 1;
                $item['level'] = self::$level[$id];
                self::$result[] = $item;
                if (isset($data[$id])) {
                    self::makeTreeCore($id, $data, $type);
                }

                $r = self::$result;
            }
        }
        return $r;
    }

    /* 格式化数据, 私有方法 */
    static function buildData($data, $options)
    {
        $config = array_merge(self::$config, $options);
        self::$config = $config;
        extract($config);

        $r = array();
        foreach ($data as $item) {
            $item = get_object_vars($item);
            $id = $item[$primary_key];
            $parent_id = $item[$parent_key];
            $r[$parent_id][$id] = $item;
        }

        return $r;
    }

    static public function getTree($data, $options = array())
    {
        $dataset = self::buildData($data, $options);
        $res = self::makeTreeCore(0, $dataset, 'normal');
        return $res;
    }

    /**
     * 数据库 - 删除/下架商品
     *
     * @param $where_data array //查询条件 参数数组
     * @param $update_data array //更新 参数数组
     * @return array
     */
    static public function deleteds($where_data, $update_data)
    {
        $data = DB::table(self::table)
            ->where($where_data)
            ->update($update_data);

        return json_decode($data, true);
    }

    /**
     * 数据库 - 更新数据
     * @param $id   //商品ID
     * @param $data //参数数组
     * @return array
     */
    static public function updatedData($id, $data)
    {
        $data = DB::table(self::table)
            ->where('id','=', $id)
            ->update($data);

        return $data;
    }

    /**
     * 数据库 - 插入数据
     * @param $data //参数数组
     * @return array
     */
    static public function insertData($data)
    {
        $data = DB::table(self::table)->insert($data);
        return $data;
    }

}
